import json

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect

# Create your views here.
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views import View

from check_ip import check_ip


def index(request):
    """视图：访问首页"""
    # print(request.path)
    # print(request.method)
    # return HttpResponse('<h3>首页</h3>')
    context = {
        "up": "世人谓我恋长安",
        "down": "其实只恋长安某"
    }
    # 模板渲染，传三个参数，请求对象，模板文件路径，传到模板的数据
    return render(request, "user/index.html", context)


"""get请求方式"""


def news(request, height, age):
    """get请求用request.GET.get(),获取查询字符串"""

    # http://127.0.0.1:8000/news/10/2?category=50&page=3
    # ?category=50&page=3 取查询字符串参数的值用GET.get()
    print(request.GET.get("category"))
    print(request.GET.get("page"))
    # http://127.0.0.1:8000/news/10/2?category=50&page=3&mylove=毛不易&mylove=赵雷
    # 多值字典可以用getlist获取，然后得到的是一个列表[‘毛不易’,'赵雷']
    print(request.GET.getlist("mylove"))
    # http://127.0.0.1:8000/news/10/2  获取 10 和2
    test = "显示新闻：%s %s" % (height, age)
    return HttpResponse(test)


"""post请求方式"""


def news3(request):
    """post请求方式，用request.POST.get(),

       获取form-data请求体中的键值对"""

    # 取请求体body中的键值对
    category = request.POST.get('category')
    page = request.POST.get('page')
    # 取form-data中的多值用 getlist
    sb = request.POST.getlist("sb")
    print(sb)
    text = '获取body中的键值对：%s %s' % (category, page)
    return HttpResponse(text)


"""json发送数据"""


def news4(request):
    """json发送数据，要先将json字符串转成字典对象，再通过"""

    # 获得json字符串
    json_str = request.body
    # 将json字符串转成字典对象,json导入的是json本身的，不是Django的json
    dict_data = json.loads(json_str)
    # 根据键从字典中取值
    category = dict_data.get('category')
    page = dict_data.get('page')
    text = '获得body中的json数据：category=%s,page=%s' % (category, page)
    return HttpResponse(text)


"""获取请求头的数据
   发送响应体和响应头数据"""


def news5(request):
    # 获取默认请求头的参数，可以用request.META.get()
    ip = request.META.get('REMOTE_ADDR')
    type = request.META.get('CONTENT_TYPE')

    # 获取自定义请求头参数，可以，要将自定义变量大写并在前面加上HTTP_
    a = request.META.get('HTTP_A')
    b = request.META.get('HTTP_B')

    # 创建一个response响应对象 HttpResponse(content= "") 发送的 content 是响应体数据，还可以发送类型和状态码，是在响应头上的
    response = HttpResponse("ip:%s type:%s a:%s b:%s" % (ip, type, a, b), content_type="text/html", status=200)

    # HttpResponse(content=响应体, content_type=响应体数据MIME类型, status=状态码)
    # response 可以当字典对象，可以添加键值对，是返回到响应头的东西
    response['category'] = "hello"
    return response


def resp(request):
    # 定义一个字典
    # dict_data = {'city':'beijing','subject':'python','name':'小明'}
    # 用JsonResponse返回字典，会自动将字典转成json字符串
    # return JsonResponse(dict_data,json_dumps_params={'ensure_ascii':False})
    # reverse 要导Django的包，否则出错
    url = reverse("user_room:resp_room")

    return redirect(url)


def set_cookie(request):
    # 思路
    # 创建响应对象，并将响应体内容写入
    # 用响应对象设置cookie
    # 返回响应对象

    # 创建响应对象，并将响应体内容写入
    response = HttpResponse("设置cookie成功")
    # 用响应对象设置cookie,在响应头中显示
    response.set_cookie('user_id', 10)
    #设置cookie不能直接存中文，否则就会报错，应该先转换成json字符串。json.dumps('中国')
    test = json.dumps('中国')
    response.set_cookie('user_name', test)
    # 返回响应对象
    return response


def get_cookie(request):
    # 思路
    # 用request.COOKIES.get('键')读取cookie键值对数据
    # 返回响应体对象

    # 用request.COOKIES.get('键')读取cookie键值对数据
    user_id = request.COOKIES.get('user_id')
    user_name = request.COOKIES.get('user_name')
    #取出来后，读取的时候不能直接读取，因为是json字符串，所以应该用json.loads(user_name)转成字符串类型
    user_name = json.loads(user_name)
    text = "用户id:%s,用户名：%s" % (user_id, user_name)
    # 返回响应体对象
    return HttpResponse(text)

def set_session(request):
    #思路
    #用request.session保存session键值对数据
    #返回保存成功响应体

    # #用request.session保存session键值对数据
    request.session['user_name'] = 'hzx'
    request.session['password'] = 123456
    #返回保存成功响应体
    return HttpResponse("保存session成功")

def get_session(request):
    #思路
    #读取session键值对数据
    #将读取到的数据返回给浏览器

    #读取session键值对数据
    user_name = request.session.get('user_name')
    psd = request.session.get('password')
    text = "用户名：%s <br> 密码：%s" % (user_name,psd)
    # #删除session字段的内容
    # request.session.clear()
    # #删除session表一整行内容
    # request.session.flush()
    #将读取到的数据返回给浏览器
    return HttpResponse(text)

# def post(request):
#     """get请求：显示发帖界面"""
#     #渲染发帖界面，因为render的第一个参数要request
#     return render(request,'user/post.html')
#
# def do_post(request):
#     """post请求：执行发帖操作"""
#     #先获取表单input自己输入的值
#     title = request.POST.get('title')
#     content = request.POST.get('content')
#     #得到了输入的值就返回响应体
#     return HttpResponse('发帖：title=%s,<br> content=%s' % (title,content))

# @check_ip
# def post(request):
#     """一个URL实现显示发帖界面和实现发帖功能"""
#     #思路
#     #要判断请求方式是什么
#     #如果是get,那么显示发帖界面
#     #将模板进行渲染
#     #如果是post，那么实现发帖功能，
#     #先获取到post请求的表单用户自己输入的内容
#     #然后再返回响应体
#
#     #get请求：显示发帖界面
#     if request.method == 'GET':
#         # 将模板进行渲染
#         return render(request,'user/post.html')
#     else:
#         #post请求：执行发帖操作
#         # 先获取到post请求的表单用户自己输入的内容
#         title = request.POST.get('title')
#         content = request.POST.get('content')
#         return HttpResponse('发帖：title=%s,<br> content=%s' % (title,content))


# 类视图
# 定义一个类，继承Django提供的View类
class PostView(View):
    
    #在类视图中使用装饰器过滤黑名单
    @method_decorator(check_ip)
    def get(self,request):
        """get请求：显示发帖界面"""
        #渲染发帖界面，因为render的第一个参数要request，所以定义的方法要将request传入
        return render(request,'user/post2.html')
    def post(self,request):
        """post请求：执行发帖操作"""
        # 先获取表单input自己输入的值
        title = request.POST.get('title')
        content = request.POST.get('content')
        #得到了输入的值就返回响应体
        return HttpResponse('发帖：title=%s,<br> content=%s' % (title,content))